home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctj0987.arc / DOWNLD.C < prev    next >
Text File  |  1987-07-02  |  5KB  |  198 lines

  1. /* DOWNLD -- PC Tech Journal Laser Printer Font Download Test
  2.  *
  3.  * Version 1.0
  4.  *
  5.  * Copyright (c) 1987, Ziff Communications Company
  6.  * Program by: Rainer McCown and Bob Smith
  7.  *
  8.  * This routine downloads a font for a single character.  It
  9.  * demonstrates how to construct the appropriate commands necessary
  10.  * to define a font.  Even though the font defines but a single 
  11.  * character, it can be generalized easily.
  12.  */
  13.  
  14. #define STD_OUT 1
  15.  
  16. extern void sndl(char [], int),
  17.         snd (char []),
  18.         setbinary(int);
  19.  
  20. struct FONTDESC_STR
  21. {
  22.  int  C26;
  23.  char C0,
  24.       ftype;
  25.  int  D0,
  26.       baseline,
  27.       cellwidth,
  28.       cellheight;
  29.  char orientation,
  30.       spacing;
  31.  int  symbolset,
  32.       pitch,
  33.       height,
  34.       E0;
  35.  char F0,
  36.       style,
  37.       weight,
  38.       typeface;
  39. };
  40.  
  41. struct FONTDESC_STR fontdesc;
  42.  
  43. struct CHARDESC_STR
  44. {
  45.  char C4,
  46.       C0,
  47.       C14,
  48.       C1,
  49.       orientation,
  50.       D0;
  51.  int  leftoff,
  52.       topoff,
  53.       charwidth,
  54.       charheight,
  55.       deltax;
  56. };
  57.  
  58. struct CHARDESC_STR chardesc;
  59.  
  60. char *letter[] = {
  61. "111111000111110000000000",
  62. "000111001000011100000000",
  63. "000111010000001100000000",
  64. "000111100000001110000000",
  65. "000111000000001110000000",
  66. "000111000000001110000000",
  67. "000111000000001110000000",
  68. "000111000000001110000000",
  69. "000111000000001110000000",
  70. "000111000000001110000000",
  71. "000111000000001110000000",
  72. "000111000000001110000000",
  73. "000111000000001110000000",
  74. "000111000000001110000000",
  75. "000111000000001110000000",
  76. "000111000000001110000000",
  77. "000111000000001110000000",
  78. "111111111001111111110000",
  79. };
  80.  
  81. /******************************* SWAP *******************************/
  82.  
  83. unsigned int swap(ibyte)
  84.  
  85. unsigned int ibyte;
  86.  
  87. {
  88.   return(ibyte >> 8 | (ibyte & 0xff) << 8);
  89. }
  90.  
  91. /******************************* MAIN *******************************/
  92.  
  93. void main()
  94.  
  95. {
  96.  unsigned int msgsiz, charw, charh;
  97.  char tmp[(50 * 50) >> 3], *p;
  98.  int ind, i, j;
  99.  
  100.  /* Change STD_OUT to binary mode to avoid
  101.     converting LFs to CR,LF and to avoid
  102.     stopping on EOFs  */
  103.  
  104.  setbinary(STD_OUT);
  105.  
  106.  /* Initialize the printer */
  107.  
  108.  snd("\x1BE");                  /* Reset the printer   */
  109.  snd("\x1B&l0E");               /* Zero the top margin */
  110.  snd("\x1B&s1C");               /* Disable EOL wrap    */
  111.  snd("\x1B9");                  /* Clear margins       */
  112.  snd("\x1B&l0O");               /* Portrait mode       */
  113.  snd("\x1B(8`");                /* Select symbol set Roman-8 */
  114.  
  115.  /* Define parameters of symbol set as
  116.        0p = Fixed space
  117.       16h = 16 cpi
  118.        8v =  8 pt
  119.        0s = upright
  120.       -3b = light
  121.        0T = line printer  */
  122.  
  123.  snd("\x1B(s0p16h8v0s-3b0T");
  124.  
  125.  /* Define current font ID */
  126.  
  127.  snd("\x1B*c10280D");
  128.  
  129.  /* Define font descriptor */
  130.  
  131.  fontdesc.C26 = swap(26);    /* Constant 26 */
  132.  fontdesc.ftype = 1;        /* 8-bit (use 0 for 7-bit font
  133.                    type) */
  134.  fontdesc.baseline = swap(30);    /* Character baseline within cell */
  135.  fontdesc.cellwidth = swap(41); /* Width of cell */
  136.  fontdesc.cellheight = swap(42); /* Height of cell */
  137.  fontdesc.orientation = 0;    /* 0 = portrait, 1 = landscape */
  138.  fontdesc.spacing = 1;        /* 0 = fixed,     1 = proportional */
  139.  fontdesc.symbolset = swap(277); /* Using 8` for Roman-8,
  140.                    277 = 8*32 + 'U' - 64 */
  141.  fontdesc.pitch = swap(4*30);    /* 30 dots wide in units of
  142.                    quarter dots */
  143.  fontdesc.height = swap(4*50);    /* 50 dots high ... */
  144.  fontdesc.style = 0;        /* 0 = upright, 1 = italic */
  145.  fontdesc.weight = 0;           /* -7 (light) to 7 (bold) */
  146.  fontdesc.typeface =swap(7);    /* 5 = Times Roman */
  147.  
  148.  snd("\x1B)s26W");
  149.  sndl((char *) &fontdesc, sizeof(fontdesc));
  150.  
  151.  /* Describe the ASCII code for the letter 'n' */
  152.  snd("\x1B*c110E");
  153.  
  154.  /* Define the header for the character 'n' */
  155.  
  156.  chardesc.C1 = 1;        /* Constant 1 */
  157.  chardesc.C4 = 4;        /* Constant 4 */
  158.  chardesc.C14 = 14;        /* Constant 14 */
  159.  chardesc.orientation = 0;    /* 0 = portrait, 1 = landscape */
  160.  chardesc.leftoff = swap(1);    /* Within character cell */
  161.  chardesc.topoff = swap(17);    /* Within character cell */
  162.  chardesc.charwidth = swap(24); /* Width of character in dots */
  163.  chardesc.charheight = swap(18); /* Height of character in dots */
  164.  chardesc.deltax = swap(4*23);    /* Skip 18 dots after printing
  165.                    in units of quarter dots */
  166.  
  167.  charw = swap(chardesc.charwidth);
  168.  charh = swap(chardesc.charheight);
  169.  
  170.  msgsiz = sizeof(chardesc)     /* Size of header plus data portion */
  171.     + charw/8 * charh;
  172.  
  173.  sprintf(tmp, "\x1B(s%dW", msgsiz); /* Start download of character */
  174.  snd(tmp);
  175.  sndl((char *) &chardesc, sizeof(chardesc));
  176.  
  177.  /* Initialize TMP to all zeros in case we re-use it */
  178.  memset(tmp, 0, sizeof(tmp));
  179.  
  180.  /* Define the bits which form the character 'n' */
  181.  
  182.  for(ind = i = 0; i < charh; ind += charw, i++)
  183.  for(p = letter[i], j = 0;
  184.      j < charw;
  185.      j++)
  186.      tmp[(ind + j) >> 3] |= (*p++ - '0') << (7 - ((ind + j) & 7));
  187.  
  188.  sndl(tmp, (charw * charh + 7) >> 3);
  189.  
  190.  snd("\x1B*p342Y\x1B*p336X\x1B(10280Xn");
  191.  
  192.  /* Eject page    */
  193.  
  194.  snd("\f");
  195.  
  196. } /* End MAIN */
  197.  
  198.